//<FileName>Math.h</FileName>
//<Athor>秋日私语</Athor>
//<Date>2006.04.15</Date>
//不使用库函数自己写库函数的解决方法：
//【分析】：
//问题描述：x^y=?
//解答过程：x^y=exp{ln(x^y)}=exp{y*lnx}
//          ln(1+x)'=1/(1+x)
//          因为 1/(1+x)=1-x+x^2-x^3+...  (-1<x<1)
//          所以 ln(1+x)=ln(1+0)+x-x^2/2+x^3/3-x^4/4+...  (-1<x<1)
//
//          一般的，ln(x) (x>0)函数的计算方法：
//          ln(x)＝ln(x2×e^x1)         (x=x2*e^x1) (0<x2<1,x1是个大于等于0的整数)
//               ＝ln(x2)+x1            (0<x2<1)
//               ＝ln(1+x3)+x1          （x2＝1＋x3） (-1<x3<0)
//               对ln(1+x3)的计算可以用前面讨论的方法
//
//          一般的，exp(x)的计算方法:
//          exp(x)=1+x+x^2/2!+x^3/3!+...    (x是任意实数）
//
//算法设计：
//         计算函数ln(1+x)的值： (-1<x<1)
//         S1：初始化：sum＝x，power＝x×-x, term=power/2, n＝3
//   S1.5:当term的绝对值小于一个很小的值（如1e-6)时，goto S6
//         S2：累加和：sum＝sum＋term
//         S3：累乘幂：power＝power×(-x)
//   S3.5: 计算项：term＝power/n
//         S4：累加n： n＝n＋1
//         S5：goto S1.5
//         S6：算法结束，sum值为函数值
//
//
//         计算函数ln(x)的值：（x>0）
//         S1：确定x1，x2和x3的值：
//             S11：初始化x2＝x，x1＝0
//             S12：如果x2<1,goto S15
//             S13：x2＝x2/e,x1＝x1＋1
//             S14：goto S12
//             S15：x3＝x2－1
//         S2：ln(x)＝ln(1+x3)+x1
//
//         计算函数exp(x)的值：（x是任意实数）
//         S1：初始化sum＝1，term＝x，n＝2
//         S2：当term的绝对值<一个很小的值（如1e－6）时，goto S7
//         S3：sum＝sum＋term
//         S4：term＝term×x÷n
//         S5：n＝n＋1
//         S6：goto S2
//         S7：算法结束，sum值为函数值
//
//         计算函数x^y的值：（x，y为任意实数）
//         x^y=exp{ln(x^y)}=exp{y*lnx}
//
//C++源程序描述：
#ifndef MATH_H
#define MATH_H

//提供数学静态函数包
class Math
{
public:
	//计算函数exp(x)的值：（x是任意实数）
	static double exp(double x);
	//计算函数ln(x)的值：（x>0）
	static double ln(double x);
	//计算函数x^y的值：（x，y为任意实数）
	static double pow(double x,double y);
	//计算函数|x|的值：（x为任意实数）
	static double abs(double x);
	//计算x的立方根
	static double cuberoot(double x);
protected:
	//计算函数ln(1+x)的值： (-1<x<1)
	static double ln1plusx(double x);
public:
	static const double precision;
	static const double e;
};//end of class Math

#endif

